package table

import (
	"fmt"
	"github.com/jedib0t/go-pretty/v6/table"
	"github.com/jedib0t/go-pretty/v6/text"
	"math/rand"
)

var count = 0

type Demo struct {
	T table.Writer
}

func NewDemo() *Demo {
	return &Demo{
		T: table.NewWriter(),
	}
}

func (d *Demo) MakeHeader() {
	header := table.Row{"IP", "Num", "PacketsRecv", "PacketLoss", "AvgRtt"}
	d.T.AppendHeader(header)
	d.T.SetAutoIndex(true)
	// d.T.SetStyle(table.StyleLight)
	d.T.Style().Options.SeparateRows = true
}

func (d *Demo) AddTitle() {
	d.T.SetTitle("This is Easy Table")
}

func (d *Demo) AppendRow() {
	// rowConfig := table.RowConfig{AutoMerge: true}
	for i := 1; i <= 2; i++ {
		row := table.Row{fmt.Sprintf("10.0.0.%v", i), i + 4, i, rand.Float64() * 100, "AppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRowAppendRow"}
		count += 1
		d.T.AppendRow(row)
	}
	d.T.AppendRow(table.Row{fmt.Sprintf("10.0.0.%v", 4), 1 + 4, 1, 0.0, "AppendRow"})
}

func (d *Demo) AppendRows() {
	var rows []table.Row
	for i := 1; i <= 2; i++ {
		rows = append(rows, table.Row{fmt.Sprintf("10.0.0.%v", i), i + 4, i, rand.Float64() * 100, "AppendRows"})
		count += 1
	}
	d.T.AppendRows(rows)
}

func (d *Demo) AppendFooter() {
	d.T.AppendFooter(table.Row{"Total", "Total", "Total", "Total", count}, table.RowConfig{AutoMerge: true, AutoMergeAlign: text.AlignCenter})
}

func (d *Demo) ColumnMerge() {
	d.T.SetColumnConfigs([]table.ColumnConfig{
		{
			Name: "AvgRtt",
			// Number是指定列的序号
			// Number: 5,
			AutoMerge: true,
			Align:     text.AlignCenter,
		},
	})
}

func (d *Demo) SetAlignCenter() {
	column := []string{"IP", "Num", "PacketsRecv", "PacketLoss", "AvgRtt"}
	c := []table.ColumnConfig{}

	// 根据表格的列数循环进行设置，统一居中
	for i := 1; i <= len(column); i++ {
		name := column[i-1]
		if name == "AvgRtt" {
			c = append(c, table.ColumnConfig{
				Name:        "AvgRtt",
				AutoMerge:   true,
				Align:       text.AlignCenter,
				AlignHeader: text.AlignCenter,
				AlignFooter: text.AlignCenter,
			})
			continue
		}
		c = append(c, table.ColumnConfig{
			Name:        column[i],
			Align:       text.AlignCenter,
			AlignHeader: text.AlignCenter,
			AlignFooter: text.AlignCenter,
		})
	}
	d.T.SetColumnConfigs(c)
}

func (d *Demo) SetWarnColor() {
	// 字体颜色
	WarnColor := text.Colors{text.BgRed}
	warnTransformer := text.Transformer(func(val interface{}) string {
		if val.(float64) > 0 {
			// 统计丢包服务器总数
			return WarnColor.Sprintf("%.2f%%", val)
		}
		return fmt.Sprintf("%v%%", val)
	})

	d.T.SetColumnConfigs([]table.ColumnConfig{
		{
			Name:        "PacketLoss",
			AutoMerge:   true,
			Align:       text.AlignCenter,
			AlignHeader: text.AlignCenter,
			AlignFooter: text.AlignCenter,
			Transformer: warnTransformer,
		},
	})
}

func (d *Demo) Print() {
	fmt.Println(d.T.Render())
}
